//在不改变原对象的基础上，通过对其进行包装扩展（添加属性或方法），使原有对象可以满足用户的更复杂需求，
// * 装饰器模式是一个对象嵌入到另一个对象中去，实际上相当于这个对象被另一个对象包装起来，形成一条包装链。
Function.prototype.before = function(fn){
    var _this = this;       // 用来保存调用这个函数的引用，如func_1调用此函数，则_this指向func_1
    return function(){      // 返回一个函数，这个函数包含原函数和新函数，原函数指的是func_1，新函数指的是fn
        fn.apply(this,arguments);   // 执行新函数
        return _this.apply(this,arguments);     // 执行原函数
    }
}

Function.prototype.after = function(fn){
    var _this = this;
    return function(){
        var r = _this.apply(this,arguments); // 先执行原函数，也就是func_1
        fn.apply(this,arguments);   // 再执行新函数
        return r;
    }
}


var func_1 = function () {
    console.log("2")
}

func_1 = func_1.before(function () {
    console.log("1");
}).after(function () {
    console.log("3");
} )

func_1();   // 输出1、2、3
// 计数、日志